package com.redepronik.negosys.invfac.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;

import org.springframework.transaction.annotation.Transactional;

import com.redepronik.negosys.invfac.entity.Bodega;
import com.redepronik.negosys.invfac.entity.Detalleegreso;
import com.redepronik.negosys.invfac.entity.Egreso;
import com.redepronik.negosys.invfac.entity.Entrada;
import com.redepronik.negosys.invfac.entity.Local;
import com.redepronik.negosys.invfac.entityAux.Cantidad;
import com.redepronik.negosys.invfac.entityAux.CantidadFactura;
import com.redepronik.negosys.invfac.entityAux.CantidadesEntradaReporte;
import com.redepronik.negosys.invfac.entityAux.ChequeReporte;
import com.redepronik.negosys.invfac.entityAux.FacturaReporte;
import com.redepronik.negosys.invfac.entityAux.GananciaFacturaReporte;
import com.redepronik.negosys.invfac.entityAux.NumeroCuotasReporte;
import com.redepronik.negosys.invfac.entityAux.VolumenVentaProducto;
import com.redepronik.negosys.rrhh.entity.Ciudad;

public interface EgresoService {
	@Transactional
	public String actualizar(Egreso egreso, Bodega bodega);

	@Transactional
	public void actualizar(Egreso egreso);

	@Transactional
	public FacturaReporte asignar(Detalleegreso detalleEgreso,
			FacturaReporte facturaReporte, int tipoDocumentoId);

	@Transactional
	public CantidadFactura calcularCantidadFactura(
			CantidadFactura cantidadFactura, FacturaReporte facturaReporte,
			String nombreMetodo);

	@Transactional
	public CantidadFactura calcularCantidadNotaEntrega(
			CantidadFactura cantidadFactura, FacturaReporte facturaReporte,
			String nombreMetodo);

	public void calcularDescuentoDolares(FacturaReporte fr);

	public void calcularDescuentoPorcentaje(FacturaReporte fr);

	@Transactional
	public List<Egreso> obtenerPorCredito(String cedulaRuc);

	@Transactional
	public CantidadesEntradaReporte calcularEntrada(Entrada entrada,
			CantidadesEntradaReporte cantidadesEntradaReporte,
			Date fechaEgreso, Date fecha);

	@Transactional
	public BigDecimal calcularEntradas(Egreso egreso);

	@Transactional
	public NumeroCuotasReporte calcularNumeroCuotasEntradasCreditos(
			Egreso egreso, NumeroCuotasReporte numeroCuotas, Date fecha);

	public void calcularPrecioCantidad(FacturaReporte fr);

	public void calcularPrecioPromocion(FacturaReporte fr, boolean iva);

	public Map<String, Object> calcularPrecioSubTotal(FacturaReporte fr);

	public void calcularPrecioTotal(FacturaReporte fr);

	public void calcularPrecioUnit(FacturaReporte fr);

	@Transactional
	public BigDecimal calcularTotal(Egreso egreso);

	@Transactional
	public FacturaReporte calcularTotales(FacturaReporte facturaReporte);

	public void cambiarDescuentoFactura(CantidadFactura cfc, CantidadFactura cfp);

	public void cambiarDescuentoNotaEntrega(CantidadFactura cfc,
			CantidadFactura cfp);

	@Transactional
	public Long contar();

	@Transactional
	public Long contar(int tipoDocumentoId);

	@Transactional
	public Long contar(String cedula);

	@Transactional
	public void devolucion(Egreso egreso);

	@Transactional
	public List<Detalleegreso> duplicarDetalleEgreso(
			List<Detalleegreso> detalleEgresos);

	@Transactional
	public Egreso duplicarEgreso(Egreso egreso, int tipoDocumentoId);

	@Transactional
	public FacesMessage eliminar(Egreso egreso, String login, String pass);

	@Transactional
	public FacesMessage eliminarFab(Egreso egreso, String login, String pass);

	@Transactional
	public boolean facturaNotaEntrega(String codigoDocumento);

	@Transactional
	public String insertar(Egreso egreso, Bodega bodega);

	@Transactional
	public void insertar(Egreso egreso);

	@Transactional
	public List<Egreso> obtener(Boolean activo, int tipoDocumentoId);

	@Transactional
	public List<Egreso> obtener(Integer criterioBusquedaEstado,
			String criterioBusquedaCliente, String criterioBusquedaCodigo,
			String criterioBusquedaDetalle, Integer tipoDocumentoId);

	@Transactional
	public List<ChequeReporte> obtenerChequesPorCobrarPorFechas(
			Date fechaInicio, Date fechaFin);

	@Transactional
	public List<ChequeReporte> obtenerChequesPorFechas(Date fechaInicio,
			Date fechaFin);

	@Transactional
	public List<Egreso> obtenerEgresosParaCredito(
			String criterioBusquedaCliente, String criterioBusquedaCodigo);

	@Transactional
	public List<Egreso> obtenerEgresosPorCliente(
			String criterioBusquedaCliente, String criterioBusquedaCodigo,
			Integer tipoDocumentoId);

	@Transactional
	public List<Egreso> obtenerEntregaProducto(Date fechaInicio, Date fechaFin,
			Local local, Ciudad ciudad);

	@Transactional
	public List<Egreso> obtenerFacturasAndNotasEntrega(
			String criterioBusquedaCliente, String criterioBusquedaCodigo,
			String criterioBusquedaDetalle);

	@Transactional
	public List<Egreso> obtenerFacturasParaGuiaRemision(int localId,
			int ciudadId, String criterioBusquedaCodigo);

	@Transactional
	public GananciaFacturaReporte obtenerGananciaPorFactura(Long egresoId,
			BigDecimal iva);

	@Transactional
	public List<GananciaFacturaReporte> obtenerGananciaPorFechas(
			Date fechaInicio, Date fechaFin, int tipoDocumentoId, BigDecimal iva);

	@Transactional
	public List<Egreso> obtenerNoPagadosPorCiudad(int ciudadId);

	@Transactional(readOnly = true)
	public Egreso obtenerPorCodigo(String codigo);

	@Transactional
	public List<Egreso> obtenerPorCreditoAlDiaAndFechaLimite(Date fechaLimite);

	@Transactional
	public List<Egreso> obtenerPorCreditoVencidoAndFechaLimite(Date fechaLimite);

	@Transactional(readOnly = true)
	public Egreso obtenerPorEgresoId(Long egresoId);

	@Transactional(readOnly = true)
	public List<Egreso> obtenerPorEstado(String cedulaRuc, int tipodocumento,
			String codigoDocumento, Date fechaInicio, Date fechaFin);

	@Transactional
	public List<Egreso> obtenerPorFechasAndTIpoDocumentoAndVendedor(
			Date fechaInicio, Date fechaFin, int tipoDocumentoId, int vendedorId);

	@Transactional
	public List<VolumenVentaProducto> obtenerVolumenVentaProducto(
			Date fechaInicio, Date fechaFin, int ordenarId);

	@Transactional
	public int posicion(FacturaReporte facturaReporte,
			List<Detalleegreso> detalleEgresos, boolean factura);

	@Transactional
	public void recalcularCantidad(Integer fila, List<FacturaReporte> list,
			List<Detalleegreso> detalleEgresos,
			CantidadFactura cantidadFactura, Integer cantidad, boolean factura);

	@Transactional
	public void recalcularPrecio(Integer fila, int bodegaId,
			List<FacturaReporte> list, List<Detalleegreso> detalleEgresos,
			CantidadFactura cantidadFactura, BigDecimal precio, boolean factura);

	@Transactional
	public CantidadFactura redondearCantidadFactura(
			CantidadFactura cantidadFacturaPresentar,
			CantidadFactura cantidadFacturaCalculos);

	@Transactional
	public Cantidad obtenerCantidadPorProductoOrVendedor(Long producto,
			Date fechaInicio, Date fechaFin, Integer vendedorId);

	@Transactional
	public Cantidad obtenerCantidadPorProductoPrecioOrVendedor(Long producto,
			Date fechaInicio, Date fechaFin, BigDecimal precio,
			Integer vendedorId);

	@Transactional
	public List<Detalleegreso> sumarCantidades(
			List<Detalleegreso> detalleEgresos);
}